package org.dicr.sys.linux;

import java.io.*;

/**
 * Элемент pap-файла.
 * 
 * @author Igor A Tarasov &lt;java@dicr.org&gt;
 * @version 1.0
 * @see "man pppd"
 */
public class PapEntry implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Специальное значение '*' имени пользователя, сервера или разрешенных адресов.<BR>
	 * Означает любое значение.
	 */
	public static final String ANY = "*";

	/**
	 * Специальное значение '-' для разрешенных IP-адресов.<BR>
	 * Означает отсутствие разрешенных или все запрещены.
	 */
	public static final String NONE = "-";

	/**
	 * Имя пользователя.
	 */
	protected String name = null;

	/**
	 * Сервер пользователя.
	 */
	protected String server = null;

	/**
	 * Пароль пользователя.
	 */
	protected String secret = null;

	/**
	 * Разрешенные IP-адреса
	 */
	protected String ips = null;

	/**
	 * Полный конструктор.
	 * 
	 * @param theName имя пользователя или null.
	 * @param theServer имя сервера или null
	 * @param theSecret пароль пользователя или null
	 * @param theIps разрешенные IP-адреса или null
	 */
	protected PapEntry(String theName, String theServer, String theSecret, String theIps) {
		this.name = theName;
		this.server = theServer;
		this.secret = theSecret;
		this.ips = theIps;
	}

	/**
	 * Возвращает имя пользователя.
	 * 
	 * @return имя пользователя или null
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Возвращает имя сервера.
	 * 
	 * @return имя сервера или null
	 */
	public String getServer() {
		return this.server;
	}

	/**
	 * Возвращает пароль.
	 * 
	 * @return пароль или null
	 */
	public String getSecret() {
		return this.secret;
	}

	/**
	 * Возвращает список разрешенных IP-адресов.
	 * 
	 * @return список ip-адресов или null
	 */
	public String getIps() {
		return this.ips;
	}

	/**
	 * Создает ключ записи.
	 * 
	 * @param name имя пользователя.
	 * @param server сервер.
	 * @return ключ: name@server.
	 */
	public static String makeKey(String name, String server) {
		StringBuilder key = new StringBuilder();
		key.append(name == null ? ANY : name);
		key.append("@");
		key.append(server == null ? ANY : server);
		return key.toString();
	}

	/**
	 * Возвращает ключ записи.
	 * 
	 * @return ключ записи в виде <CODE>name@server</CODE>
	 */
	protected String getKey() {
		return makeKey(this.name, this.server);
	}

	/**
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return PapEntry.class.getCanonicalName() + "[" + getKey() + "]";
	}

	/**
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object o) {
		if (o == this) { return true; }
		if (o == null) { return false; }
		if (!(o instanceof PapEntry)) { return false; }
		return ((PapEntry) o).getKey().equals(getKey());
	}

	/**
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return getKey().hashCode();
	}
}
